package br.com.sap.controle;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import br.com.sap.modelo.AnuncioObjAchado;
import br.com.sap.modelo.AnuncioObjPerdido;
import br.com.sap.modelo.Categoria;
import br.com.sap.modelo.Imagem;
import br.com.sap.modelo.Marca;
import br.com.sap.modelo.Modelo;
import br.com.sap.modelo.Tipo;
import br.com.sap.modelo.Usuario;
import br.com.sap.modelo.enums.EnumSituacao;
import br.com.sap.persistencia.servico.AnuncioObjAchadoServico;
import br.com.sap.persistencia.servico.AnuncioObjPerdidoServico;
import br.com.sap.persistencia.servico.CategoriaServico;
import br.com.sap.persistencia.servico.ImagemServico;
import br.com.sap.persistencia.servico.MarcaServico;
import br.com.sap.persistencia.servico.ModeloServico;
import br.com.sap.persistencia.servico.ServicoGenerico;
import br.com.sap.persistencia.servico.TipoMarcaServico;
import br.com.sap.persistencia.servico.TipoServico;
import br.com.sap.persistencia.servico.UsuarioServico;
import br.com.sap.utils.erros.Erro;
import br.com.sap.utils.erros.TipoErro;
import br.com.sap.utils.erros.TipoMensagemErro;
import br.com.sap.utils.mail.EmailAnuncioObjAchado;


public class AnuncioObjAchadoControle extends ControleGenerico<AnuncioObjAchado> {

	private AnuncioObjAchadoServico anuncioObjAchadoServico = new AnuncioObjAchadoServico();
	private AnuncioObjPerdidoServico anuncioObjPerdidoServico = new AnuncioObjPerdidoServico();
	private UsuarioServico usuarioServico = new UsuarioServico();
	private CategoriaServico categoriaServico = new CategoriaServico();
	private TipoServico tipoServico = new TipoServico();
	private MarcaServico marcaServico = new MarcaServico();
	private ImagemServico imagemServico = new ImagemServico();
	private TipoMarcaServico tipoMarcaServico = new TipoMarcaServico();
	private ModeloServico modeloServico = new ModeloServico();
	private ControleGenerico<AnuncioObjAchado> controleGenerico;
	
	
	public MarcaServico getMarcaServico() {
		return marcaServico;
	}

	public void setMarcaServico(MarcaServico marcaServico) {
		this.marcaServico = marcaServico;
	}
	

	public ControleGenerico<AnuncioObjAchado> getControleGenerico() {
		return controleGenerico;
	}

	public void setControleGenerico(ControleGenerico<AnuncioObjAchado> controleGenerico) {
		this.controleGenerico = controleGenerico;
	}

	public AnuncioObjAchadoServico getAnuncioObjAchadoServico() {
		return anuncioObjAchadoServico;
	}
	
	@Override
	public ServicoGenerico<AnuncioObjAchado> getServico() {
		// TODO Auto-generated method stub
		return this.anuncioObjAchadoServico;
	}
	
	public TipoMarcaServico getTipoMarcaServico() {
		return tipoMarcaServico;
	}

	public void setTipomarcaServico(TipoMarcaServico tipoMarcaServico) {
		this.tipoMarcaServico = tipoMarcaServico;
	}

	public UsuarioServico getUsuarioServico() {
		return usuarioServico;
	}

	public void setUsuarioServico(UsuarioServico usuarioServico) {
		this.usuarioServico = usuarioServico;
	}
	
	
	public List<Categoria> getListarCategoria() {
		return categoriaServico.getLista();
	}
	
	public List<Tipo> getListarTipo(Categoria categoria) {
		tipoServico.camposProcura.limpar();
		if (categoria != null) {
			tipoServico.camposProcura.add("categoria",
					categoria.getId().toString(), true);
		} else {
			System.out.println("CATEGORIA NULL");
			return null;
		}

		return tipoServico.procura();
	}
	
	public List<Marca> getListarMarca(Tipo tipo) {
		marcaServico.camposProcura.limpar();
		if (tipo != null){
			marcaServico.camposProcura.add("tipo", tipo.getId().toString(), true);			
						
		} else {
			
			System.out.println("Tipo NULL");
			return null;
		}

		return marcaServico.procura();
	}


	
	
	public List<Modelo> getListarModelos(Marca marca) {
		modeloServico.camposProcura.limpar();
		if (marca != null) {
			modeloServico.camposProcura.add("marca",marca.getId().toString(), true);
		} else {
			System.out.println("Marca NULL");
			return null;
		}

		return modeloServico.procura();
	}
	
	public List<AnuncioObjAchado> getListarAnuncios(String chaveBusca, String usuarioSessao, String acesso){
		anuncioObjAchadoServico.camposProcura.limpar();
		if(acesso.equals(1)){
		if (chaveBusca != null){
			this.getServico().camposProcura.add(("descricao"), chaveBusca);
			this.getServico().camposProcura.add(("situacao"), "1", true);
			this.getServico().camposProcura.add(("usuario"), usuarioSessao, true);
			this.getServico().camposProcura.setCondicional("and");
				} 	else{
					
					this.getServico().camposProcura.add(("situacao"), "1", true);
					this.getServico().camposProcura.setCondicional("and");
				}
		
		} else {
			
		if (chaveBusca != null) {
		this.getServico().camposProcura.add(("descricao"), chaveBusca);
		this.getServico().camposProcura.add(("situacao"), "1", true);
		this.getServico().camposProcura.add(("usuario"), usuarioSessao, true);
		this.getServico().camposProcura.setCondicional("and");
		}else{
			
			this.getServico().camposProcura.add(("situacao"), "1", true);
			this.getServico().camposProcura.add(("usuario"), usuarioSessao, true);
			this.getServico().camposProcura.setCondicional("and");
				}
			
			}
		
		
		

		return anuncioObjAchadoServico.procura();
	}


	
	
	public int registrarAnuncioObjAchado(AnuncioObjAchado anuncioObjAchado, Usuario usuarioLogado) {
		
		int retorno;
		retorno = 0;
		if(antesProcurar(anuncioObjAchado)){			
			if(anuncioObjAchado.getId() == null){
				if(verificaconsistencia(anuncioObjAchado, usuarioLogado)){	
					if(persiste(anuncioObjAchado)){
							retorno = 1;
							}
				
			}else{
				super.erros.add(new Erro(TipoErro.VIOLACAO_CONSISTENCIA, "VIOLACAO_CONSISTENCIA", TipoMensagemErro.ERROR));
				retorno = 3;
			}
		}else{
			if(verificaduplicidade(anuncioObjAchado,  usuarioLogado)){
				if(persiste(anuncioObjAchado)){
					retorno = 2;
					}
					}else{
						retorno = 4;
				super.erros.add(new Erro(TipoErro.VIOLACAO_UNICIDADE, "VIOLACAO_UNICIDADE", TipoMensagemErro.ERROR));
			}
		}
		
		}else{
			retorno = 5;
		}
		return retorno;
	}
	
	public boolean removerAnuncioObjAchado(AnuncioObjAchado anuncioObjAchado, Usuario usuarioLogado) {
	anuncioObjAchado.setStatus(0);
	anuncioObjAchado.setSituacao(EnumSituacao.EXCLUIDO);
	int receberetorno;
	boolean retorno;
	receberetorno = registrarAnuncioObjAchado(anuncioObjAchado, usuarioLogado);
	retorno = false;
	if(receberetorno == 1){
				retorno = true;
				}else{
				super.erros.add(new Erro(TipoErro.EMAILERROR,"EMAILERROR", TipoMensagemErro.ERROR));
				retorno = false;
			}
	return retorno;
	}
	
	public boolean verificaconsistencia(AnuncioObjAchado anuncioObjAchado, Usuario usuarioLogado){
		
		SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
		this.anuncioObjAchadoServico.camposProcura.add(("usuario"), usuarioLogado.getId().toString(), true);
		this.anuncioObjAchadoServico.camposProcura.add(("categoria"), anuncioObjAchado.getCategoria().getId().toString(),true);
		this.anuncioObjAchadoServico.camposProcura.add(("tipo"), anuncioObjAchado.getTipo().getId().toString(), true);
		this.anuncioObjAchadoServico.camposProcura.add(("tipoMarca"), anuncioObjAchado.getTipoMarca().getId().toString(), true);
		this.anuncioObjAchadoServico.camposProcura.add(("modelo"), anuncioObjAchado.getModelo().getId().toString(), true);
		this.anuncioObjAchadoServico.camposProcura.add(("dataqachou"), df.format(anuncioObjAchado.getDataqachou()), true);
		this.anuncioObjAchadoServico.camposProcura.setCondicional("and");
		ArrayList<AnuncioObjAchado> anuncioObjAchados = procura();
				if (anuncioObjAchados.size() > 0) {
					return  false;
				}else
					return true;
		}

	
	public boolean verificaduplicidade(AnuncioObjAchado anuncioObjAchado, Usuario usuarioLogado){		
		
		SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");  		
		this.anuncioObjAchadoServico.camposProcura.add(("usuario"), usuarioLogado.getId().toString(), true);
		this.anuncioObjAchadoServico.camposProcura.add(("categoria"), anuncioObjAchado.getCategoria().getId().toString(), true);
		this.anuncioObjAchadoServico.camposProcura.add(("tipo"), anuncioObjAchado.getTipo().getId().toString(), true);
		this.anuncioObjAchadoServico.camposProcura.add(("tipoMarca"), anuncioObjAchado.getTipoMarca().getId().toString(), true);
		this.anuncioObjAchadoServico.camposProcura.add(("modelo"), anuncioObjAchado.getModelo().getId().toString(), true);
		this.anuncioObjAchadoServico.camposProcura.add(("dataqachou"), df.format(anuncioObjAchado.getDataqachou()), true);		
		this.anuncioObjAchadoServico.camposProcura.setCondicional("and");
		ArrayList<AnuncioObjAchado> anuncioObjAchados = procura();
				if (anuncioObjAchados.size() == 0) {
					return  true;
				}else{
							
					return false;
					}
		}
	
	public List<AnuncioObjPerdido> getListarAnunciosPerdidos(AnuncioObjAchado anuncioObjAchado){
							anuncioObjPerdidoServico.camposProcura.limpar();
							System.out.println(anuncioObjAchado.getCategoria().getId().toString()); 
							System.out.println(anuncioObjAchado.getTipo().getId().toString());
							System.out.println(anuncioObjAchado.getTipoMarca().getId().toString());
							this.anuncioObjPerdidoServico.camposProcura.add(("categoria"), anuncioObjAchado.getCategoria().getId().toString(), true);
							this.anuncioObjPerdidoServico.camposProcura.add(("tipo"), anuncioObjAchado.getTipo().getId().toString(), true);
							this.anuncioObjPerdidoServico.camposProcura.add(("tipoMarca"), anuncioObjAchado.getTipoMarca().getId().toString(), true);
							this.anuncioObjPerdidoServico.camposProcura.add(("modelo"), anuncioObjAchado.getModelo().getId().toString(), true);
							this.anuncioObjPerdidoServico.camposProcura.setCondicional("and");					
							return anuncioObjPerdidoServico.procura();
	}

	public boolean enviarAnuncioObjAchado(String destinatarios, AnuncioObjAchado anuncioObjAchado) {
		   	boolean retorno;
		   	retorno = false;
			destinatarios.replace(" ", "");		    
		    String adddestinarios[] = destinatarios.split(";");
		     
		    for(int i = 0; i < adddestinarios.length; i++){
		      EmailAnuncioObjAchado email = new EmailAnuncioObjAchado(anuncioObjAchado, adddestinarios[i]);
		      if (email.enviar()) {
		    	  System.out.println(adddestinarios[i]);
		    	  retorno = true;
				}else{
					retorno = false;
					super.erros.add(new Erro(TipoErro.EMAILERROR,"EMAILERROR", TipoMensagemErro.ERROR));
					}
				}
		      return retorno; 
		    }
	
	
	public List<Imagem> getListarImagem(/*AnuncioObjAchado anuncioObjAchado*/) {
		imagemServico.camposProcura.limpar();
		//if (anuncioObjAchado != null) {
				//imagemServico.camposProcura.add("anuncioObjAchado_id", anuncioObjAchado.getId().toString(), true);
				imagemServico.camposProcura.add("tipo_anuncio","2", true);
				
				/*} else {
			System.out.println("IMAGEM NULL");
			return null;
		}*/

		return imagemServico.procura();
	}
	
	
	
}